package com.gs.view.entrate;

import java.util.Date;
import java.util.Observable;

import android.app.DatePickerDialog;
import android.app.Dialog;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.inputmethod.EditorInfo;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.Spinner;
import android.widget.Toast;

import com.gs.Controllore;
import com.gs.R;
import com.gs.business.AltreUtil;
import com.gs.business.DBUtil;
import com.gs.business.cache.CacheEntrate;
import com.gs.business.comadi.entrate.CommandDeleteEntrata;
import com.gs.business.comadi.entrate.CommandInserisciEntrata;
import com.gs.business.comadi.entrate.CommandUpdateEntrata;
import com.gs.domain.Entrate;
import com.gs.domain.wrapper.WrapEntrate;
import com.gs.view.riepilogo.ListaEntrate;
import comi.gsi.command.CommandManager;

public class EntrateView extends AbstractEntrateView {

	protected DatePickerDialog.OnDateSetListener mDateSetListener = null;
	@SuppressWarnings("unused")
	private DatePickerDialog calendario = null;
	private final EditText data = null;
	private final EditText descrizione = null;
	private final Spinner listaTipi = null;
	private final EditText nome = null;
	private final EditText euro = null;
	private final Button viewOrCanc = null;
	private final Button inserisciOaggiorna = null;
	private ArrayAdapter<String> arrayAdapter = null;

	@Override
	protected int getIdLayout() {
		return R.layout.entrate;
	}

	@Override
	protected void myOnCreate(final Bundle savedInstanceState) {
		Intent i = getIntent();
		int prova = i.getIntExtra("idEntrata", 0);

		initForSpecificUse(prova);

		getData().setText(getDay() + "/" + getMonth() + "/" + getYear());
		getData().setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(final View v, final MotionEvent event) {
				getData().setImeOptions(EditorInfo.IME_ACTION_DONE);
				calendario = (DatePickerDialog) onCreateDialog(0);
				showDialog(0);
				return true;
			}
		});

		mDateSetListener = new DatePickerDialog.OnDateSetListener() {

			@Override
			public void onDateSet(final DatePicker view, final int year, final int monthOfYear, final int dayOfMonth) {
				setYear(year);
				setMonth(monthOfYear);
				setDay(dayOfMonth);
				updateDisplay();

			}
		};

		getListaTipi().setAdapter(arrayAdapter);

		getInserisciOaggiorna().setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(final View v) {

				//memorizzo entrata come era prima, creo il clone prima di aggiornare il model dalla vista
				Entrate clonata = ((Entrate) getModelEntrate().getEntitaPadre()).clona();

				//aggiorno il modello prendendo le nuove info dalla vista
				aggiornaModelDaVista();

				//eseguo i comandi
				if (getInserisciOaggiorna().getText().equals("Aggiorna")) {
					Entrate aggiornata = (Entrate) getModelEntrate().getEntitaPadre();
					CommandUpdateEntrata updateEntrata = new CommandUpdateEntrata(clonata, aggiornata);
					if (CommandManager.getIstance().invocaComando(updateEntrata)) {
						Toast.makeText(EntrateView.this, "Entrata aggiornata correttamente", Toast.LENGTH_SHORT).show();
					}

				} else if (getInserisciOaggiorna().getText().equals("Inserisci")) {
					final int idEntrate = (CacheEntrate.getSingleton().getMaxId()) + 1;
					getModelEntrate().setidEntrate(idEntrate);
					if (CommandManager.getIstance().invocaComando(new CommandInserisciEntrata(getModelEntrate()))) {
						Toast.makeText(EntrateView.this, "Entrata inserita correttamente", Toast.LENGTH_SHORT).show();
					}
				}
			}
		});

		getViewOrCanc().setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(final View v) {
				if (getViewOrCanc().getText().equals("Visualizza")) {
					final Intent i = new Intent(v.getContext(), ListaEntrate.class);
					v.getContext().startActivity(i);
				} else if (getViewOrCanc().getText().equals("Elimina")) {
					aggiornaModelDaVista();
					CommandDeleteEntrata cancEntrata = new CommandDeleteEntrata((Entrate) getModelEntrate().getEntitaPadre());
					if (CommandManager.getIstance().invocaComando(cancEntrata)) {
						Toast.makeText(EntrateView.this, "Entrata eliminata correttamente", Toast.LENGTH_SHORT).show();
					}
				}
			}
		});

	}

	public void initForSpecificUse(final int prova) {
		arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, new String[] { "Fisse", "Variabili" });
		if (prova != 0) {
			Entrate entrata = CacheEntrate.getSingleton().getEntrate(Integer.toString(prova));
			this.setModelEntrate(new WrapEntrate(entrata));
			update(this.modelEntrate, null);
			getInserisciOaggiorna().setText("Aggiorna");
			getViewOrCanc().setText("Elimina");
		} else {
			getInserisciOaggiorna().setText("Inserisci");
			setModelEntrate(new WrapEntrate());
		}
	}

	@Override
	protected Dialog onCreateDialog(final int id) {
		return new DatePickerDialog(this, mDateSetListener, getYear(), getMonth(), getDay());
	}

	@Override
	public boolean onCreateOptionsMenu(final Menu menu) {
		super.onCreateOptionsMenu(menu);
		menu.add(0, 0, 0, "Lista Entrate");
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(final MenuItem item) {
		super.onOptionsItemSelected(item);
		if (item.getItemId() == 0) {
			final Intent i = new Intent(EntrateView.this, ListaEntrate.class);
			(EntrateView.this).startActivity(i);
		}
		return true;
	}

	@Override
	public void update(final Observable arg0, final Object arg1) {
		if (getNome() != null & modelEntrate.getNomeEntita() != null) {
			getNome().setText(modelEntrate.getNomeEntita());
		}
		if (getDescrizione() != null & modelEntrate.getdescrizione() != null) {
			getDescrizione().setText(modelEntrate.getdescrizione());
		}
		if (getData() != null & modelEntrate.getdata() != null) {
			getData().setText(modelEntrate.getdata());
		}
		if (getEuro() != null & modelEntrate.getinEuro() != 0) {
			getEuro().setText(Double.toString(modelEntrate.getinEuro()));
		}
		if (getListaTipi() != null & modelEntrate.getFisseoVar() != null) {
			getListaTipi().setSelection(arrayAdapter.getPosition(modelEntrate.getFisseoVar()));
		}
	}

	protected void updateDisplay() {
		StringBuilder stringData = new StringBuilder().append(getMonth() + 1).append("/");
		stringData.append(getDay()).append("/").append(getYear()).append("");
		getData().setText(stringData);
	}

	public void aggiornaModelDaVista() {
		setcNome(getNome().getText().toString());
		setcDescrizione(getDescrizione().getText().toString());
		setFisseOVar((String) getListaTipi().getSelectedItem());

		if (AltreUtil.checkData(getData().getText().toString(), "/")) {
			setcData(getData().getText().toString());
		} else {
			// I18NManager.getSingleton().getMessaggio("datainformat");
		}
		if (AltreUtil.checkDouble(getEuro().getText().toString())) {
			final Double euroo = Double.parseDouble(getEuro().getText().toString());
			setdEuro(AltreUtil.arrotondaDecimaliDouble(euroo));
		} else {
			// I18NManager.getSingleton().getMessaggio("valorenotcorrect");
		}
		setUtenti(Controllore.getUtenteLogin());
		setDataIns(DBUtil.dataToString(new Date(), "dd/MM/yyyy"));
	}

	public boolean nonEsistonoCampiNonValorizzati() {
		return getNome().getText() != null && getDescrizione().getText() != null && getListaTipi().getSelectedItem() != null && getEuro().getText() != null && getData().getText() != null;
	}

	public EditText getData() {
		return (EditText) lazyLoad(data, R.id.dataEntrata);
	}

	public EditText getDescrizione() {
		return (EditText) lazyLoad(descrizione, R.id.descrEntrata);
	}

	public Spinner getListaTipi() {
		return (Spinner) lazyLoad(listaTipi, R.id.tipoEntrata);
	}

	public EditText getNome() {
		return (EditText) lazyLoad(nome, R.id.nomeEntrata);
	}

	public EditText getEuro() {
		return (EditText) lazyLoad(euro, R.id.euro);
	}

	public Button getViewOrCanc() {
		return (Button) lazyLoad(viewOrCanc, R.id.visEntrate);
	}

	public Button getInserisciOaggiorna() {
		return (Button) lazyLoad(inserisciOaggiorna, R.id.inserisci);
	}

}
